<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>

        //利用字面量创建对象
        var tbh = {
            name: '华安9527',
            age: 18,
            addrss: '昆明',
            eat: function () {
                alert("西瓜");
            },
            sleep: function () {
                alert("睡觉");
            }
        }

        //访问对象中的属性 方法
        //对象.属性|方法
        console.log(tbh.name);//属性
        console.log(tbh['name']);//访问属性key对应值

        //tbh.eat();//带小括号

        //通过new Object来创建对象
        var obj = new Object();//创建空对象
        //为空对象赋属性 方法
        obj.name = "刘德华";
        obj.age = 18;
        obj.sex = "男";
        obj.show = function () {
            alert("唱歌");
        }

        console.log(obj);
        obj.show();

        //上面两中创建对象的方法有一个弊端 当需要多个对象是且属性名和方法都一致时 只能复制修改

        //为了解决代码重复问题 使用构造函数来创建对象

        //定义构造函数
        function Singer(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.eat = function () {
                alert("吃");
            };
        }

        var gfc = new Singer("郭富城", 45, "男");
        console.log(gfc);
        
        var zj = new Singer("张杰", 45, "男");
        console.log(gfc);

        var zjl = new Singer("周杰伦", 45, "男");
        console.log(gfc);


        /*
        过程：
        在构造函数执行之前，new 会创建一个空对象
        this指的就是调用构造函数的对象（空）
        this.xxx  就是在为空对象进行赋值
        执行完代码以后
        整一个this是包含了所有属性的对象
        
        
        
        
        */


    </script>
</head>

<body>

</body>

</html>